package src.main.java.action;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;

import src.main.java.dao.OcorrenciaDAO;
import src.main.java.dao.PessoaDAO;
import src.main.java.entity.Ocorrencia;
import src.main.java.entity.TipoOcorrencia;

public class OcorrenciaAction {
	private Ocorrencia ocorrencia;
	private ArrayList<Ocorrencia> ocorrenciasList;
	private OcorrenciaDAO ocorrenciaDAO;
	private PessoaDAO pessoaDAO;
	private Integer id;
	private String feedback;
	
	@Action(value = "goToCadastroOcorrencia", results = {
			@Result(location = "cadastroOcorrencia.jsp", name = "success") }
	)
	public String goToCadastro(){
		return "success";
	}
	
	@Action(value = "saveOcorrencia", results = {
			@Result(location = "ocorrencias.jsp", name = "success"),
			@Result(location = "cadastroOcorrencia.jsp", name = "fail") }
	)
	public String save(){
		boolean sucesso = true;
		feedback = "sucesso";
		
		if(ocorrenciaDAO == null){
			ocorrenciaDAO = new OcorrenciaDAO();
		}
		if(pessoaDAO == null){
			pessoaDAO = new PessoaDAO();
		}
		
		if(pessoaDAO.getPessoaByCpf(ocorrencia.getCpf()) == null){
			feedback = "naoExiste";
			return "fail";
		}
		
		if(ocorrenciaDAO.getOcorrenciaById(ocorrencia.getId()) != null){
			Ocorrencia old = ocorrenciaDAO.getOcorrenciaById(ocorrencia.getId());
			if(old.equals(ocorrencia)){
				feedback = "naoEditado";
				return "fail";
			} else {
				sucesso = ocorrenciaDAO.editOcorrencia(ocorrencia);
			}
		} else {
			sucesso = ocorrenciaDAO.saveOcorrencia(ocorrencia);
		}
		
		if (!sucesso){
			feedback = "BDError";
			return "fail";
		}
		
		ocorrencia = null;
		return list();
	}
	
	@Action(value = "editOcorrencia", results = {
			@Result(location = "cadastroOcorrencia.jsp", name = "success") }
	)
	public String edit(){
		if(ocorrenciaDAO == null){
			ocorrenciaDAO = new OcorrenciaDAO();
		}
		ocorrencia = ocorrenciaDAO.getOcorrenciaById(id);
		feedback = "";
		
		return "success";
	}
	
	@Action(value = "removeOcorrencia", results = {
			@Result(location = "ocorrencias.jsp", name = "success")	}
	)
	public String remove(){
		boolean sucesso = false;
		feedback = "sucesso";
		
		if(ocorrenciaDAO == null){
			ocorrenciaDAO = new OcorrenciaDAO();
		}
		ocorrencia = ocorrenciaDAO.getOcorrenciaById(id);
		sucesso = ocorrenciaDAO.removeOcorrencia(ocorrencia);
		
		if (!sucesso){
			feedback = "BDError";
		} else {
			feedback = "sucesso";
		}
		
		ocorrencia = null;
		return list();
	}
	
	@Action(value = "listOcorrencia", results = {
			@Result(location = "ocorrencias.jsp", name = "success") }
	)
	public String list(){
		
		if (ocorrencia != null && ocorrencia.getDataInicioBusca() != null && ocorrencia.getDataFimBusca() != null){
			if (ocorrencia.getDataInicioBusca().after(ocorrencia.getDataFimBusca()))
				feedback = "erroIntervalo";
		}
		
		if (!"erroIntervalo".equals(feedback)){
			if(ocorrenciaDAO == null){
				ocorrenciaDAO = new OcorrenciaDAO();
			}
			ocorrenciasList = ocorrenciaDAO.listOcorrencia(ocorrencia);
			
			if(ocorrenciasList.size() == 0){
				feedback = "listavazia";
			}
		}
		
		return "success";
	}

	public ArrayList<Ocorrencia> getOcorrenciasList() {
		return ocorrenciasList;
	}

	public void setOcorrenciasList(ArrayList<Ocorrencia> ocorrenciasList) {
		this.ocorrenciasList = ocorrenciasList;
	}
	
	public Ocorrencia getOcorrencia() {
		return ocorrencia;
	}

	public void setOcorrencia(Ocorrencia ocorrencia) {
		this.ocorrencia = ocorrencia;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Map<Integer, String> getTiposOcorrencia() {
		if(ocorrenciaDAO == null){
			ocorrenciaDAO = new OcorrenciaDAO();
		}
		List<TipoOcorrencia> tipos = ocorrenciaDAO.getTiposOcorrencia();
		Map<Integer, String> map = new HashMap<Integer, String>();
		for(TipoOcorrencia t : tipos){
			map.put(t.getId(), t.getTipo());
		}
		return map;
	}

	public String getFeedback() {
		return feedback;
	}

	public void setFeedback(String feedback) {
		this.feedback = feedback;
	}

}
